package resp

import (
	"github.com/gogf/gf/v2/net/ghttp"
)

/*
@Time : 2023/6/19 21:06
@Author : 56766
@File : jsonData.go

*/

type StatusCode int

// JsonData 通用API响应
type JsonData struct {
	C *JsonResult
	R *ghttp.Request
}

type JsonResult struct {
	Code     StatusCode  `json:"code"`     // 响应编码：0成功 401请登录 403无权限  500错误
	Msg      string      `json:"msg"`      // 消息提示语
	Data     interface{} `json:"data"`     // 数据对象
	Redirect string      `json:"redirect"` //跳转链接
	Count    int         `json:"count"`    //总数

}

const SucCode StatusCode = 0
const ComCode StatusCode = 200
const ErrCode StatusCode = 500
const ForbiddenCode StatusCode = 403
const NoLoginCode StatusCode = 401

// SetMsg 设置消息体的内容
func (s *JsonData) SetMsg(msg string) *JsonData {
	s.C.Msg = msg
	return s
}

// SetData 设置消息体的数据
func (s *JsonData) SetData(data interface{}) *JsonData {
	s.C.Data = data
	return s
}

// SetCount 设置消息体的数据
func (s *JsonData) SetCount(count int) *JsonData {
	s.C.Count = count
	return s
}

// SetRedirect 设置消息体的数据
func (s *JsonData) SetRedirect(redirect string) *JsonData {
	s.C.Redirect = redirect
	return s
}

// SetErrorCode 设置消息体的编码
func (s *JsonData) SetErrorCode() *JsonData {
	s.C.Code = ErrCode
	return s
}

// SetSuccessCode 设置消息体的编码
func (s *JsonData) SetSuccessCode() *JsonData {
	s.C.Code = SucCode
	return s
}

// SetForbiddenCode 设置消息体的编码
func (s *JsonData) SetForbiddenCode() *JsonData {
	s.C.Code = ForbiddenCode
	return s
}

// SetError 设置所有消息
func (s *JsonData) SetError(msg string) *JsonData {
	s.C.Msg = msg
	s.C.Code = ErrCode
	return s
}
func (s *JsonData) SetErrorJsonExit(msg string) {
	s.C.Msg = msg
	s.C.Code = ErrCode
	s.R.Response.WriteJsonExit(s.C)
}
func (s *JsonData) SetNoLoginJsonExit(msg string) {
	s.C.Msg = msg
	s.C.Code = NoLoginCode
	s.R.Response.WriteJsonExit(s.C)
}

// SetForbidden 设置所有消息
func (s *JsonData) SetForbidden(msg string) *JsonData {
	s.C.Msg = msg
	s.C.Code = ForbiddenCode
	return s
}

func (s *JsonData) SetForbiddenJsonExit(msg string) {
	s.C.Msg = msg
	s.C.Code = ForbiddenCode
	s.R.Response.WriteJsonExit(s.C)
}

// SetSuccess 设置所有消息
func (s *JsonData) SetSuccess(msg string, data interface{}) *JsonData {
	s.C.Msg = msg
	s.C.Code = SucCode
	s.C.Data = data
	return s
}

func (s *JsonData) SetSuccessJsonExit(msg string, data interface{}) {
	s.C.Msg = msg
	s.C.Code = SucCode
	s.C.Data = data
	s.R.Response.WriteJsonExit(s.C)
}
func (s *JsonData) SetSuccessMapExit(data JsonResult) {
	data.Code = SucCode
	s.R.Response.WriteJsonExit(data)
}

// WriteJson 输出json到客户端
func (s *JsonData) WriteJson() *JsonData {
	s.R.Response.WriteJson(s.C)
	return s
}

// WriteDataJson 输出json到客户端
func (s *JsonData) WriteDataJson(data map[string]interface{}) *JsonData {
	s.R.Response.WriteJson(data)
	return s
}
func (s *JsonData) WriteJsonExit() {
	s.R.Response.WriteJsonExit(s.C)
}
